home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / mroute6.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  6.8 KB  |  263 lines

  1. #ifndef __LINUX_MROUTE6_H
  2. #define __LINUX_MROUTE6_H
  3.  
  4. #include <linux/types.h>
  5. #include <linux/sockios.h>
  6.  
  7. /*
  8.  *    Based on the MROUTING 3.5 defines primarily to keep
  9.  *    source compatibility with BSD.
  10.  *
  11.  *    See the pim6sd code for the original history.
  12.  *
  13.  *      Protocol Independent Multicast (PIM) data structures included
  14.  *      Carlos Picoto (cap@di.fc.ul.pt)
  15.  *
  16.  */
  17.  
  18. #define MRT6_BASE    200
  19. #define MRT6_INIT    (MRT6_BASE)    /* Activate the kernel mroute code     */
  20. #define MRT6_DONE    (MRT6_BASE+1)    /* Shutdown the kernel mroute        */
  21. #define MRT6_ADD_MIF    (MRT6_BASE+2)    /* Add a virtual interface        */
  22. #define MRT6_DEL_MIF    (MRT6_BASE+3)    /* Delete a virtual interface        */
  23. #define MRT6_ADD_MFC    (MRT6_BASE+4)    /* Add a multicast forwarding entry    */
  24. #define MRT6_DEL_MFC    (MRT6_BASE+5)    /* Delete a multicast forwarding entry    */
  25. #define MRT6_VERSION    (MRT6_BASE+6)    /* Get the kernel multicast version    */
  26. #define MRT6_ASSERT    (MRT6_BASE+7)    /* Activate PIM assert mode        */
  27. #define MRT6_PIM    (MRT6_BASE+8)    /* enable PIM code    */
  28.  
  29. #define SIOCGETMIFCNT_IN6    SIOCPROTOPRIVATE    /* IP protocol privates */
  30. #define SIOCGETSGCNT_IN6    (SIOCPROTOPRIVATE+1)
  31. #define SIOCGETRPF    (SIOCPROTOPRIVATE+2)
  32.  
  33. #define MAXMIFS        32
  34. typedef unsigned long mifbitmap_t;    /* User mode code depends on this lot */
  35. typedef unsigned short mifi_t;
  36. #define ALL_MIFS    ((mifi_t)(-1))
  37.  
  38. #ifndef IF_SETSIZE
  39. #define IF_SETSIZE    256
  40. #endif
  41.  
  42. typedef    __u32        if_mask;
  43. #define NIFBITS (sizeof(if_mask) * 8)        /* bits per mask */
  44.  
  45. #if !defined(__KERNEL__) && !defined(DIV_ROUND_UP)
  46. #define    DIV_ROUND_UP(x,y)    (((x) + ((y) - 1)) / (y))
  47. #endif
  48.  
  49. typedef struct if_set {
  50.     if_mask ifs_bits[DIV_ROUND_UP(IF_SETSIZE, NIFBITS)];
  51. } if_set;
  52.  
  53. #define IF_SET(n, p)    ((p)->ifs_bits[(n)/NIFBITS] |= (1 << ((n) % NIFBITS)))
  54. #define IF_CLR(n, p)    ((p)->ifs_bits[(n)/NIFBITS] &= ~(1 << ((n) % NIFBITS)))
  55. #define IF_ISSET(n, p)  ((p)->ifs_bits[(n)/NIFBITS] & (1 << ((n) % NIFBITS)))
  56. #define IF_COPY(f, t)   bcopy(f, t, sizeof(*(f)))
  57. #define IF_ZERO(p)      bzero(p, sizeof(*(p)))
  58.  
  59. /*
  60.  *    Passed by mrouted for an MRT_ADD_MIF - again we use the
  61.  *    mrouted 3.6 structures for compatibility
  62.  */
  63.  
  64. struct mif6ctl {
  65.     mifi_t    mif6c_mifi;        /* Index of MIF */
  66.     unsigned char mif6c_flags;    /* MIFF_ flags */
  67.     unsigned char vifc_threshold;    /* ttl limit */
  68.     u_short     mif6c_pifi;        /* the index of the physical IF */
  69.     unsigned int vifc_rate_limit;    /* Rate limiter values (NI) */
  70. };
  71.  
  72. #define MIFF_REGISTER    0x1    /* register vif    */
  73.  
  74. /*
  75.  *    Cache manipulation structures for mrouted and PIMd
  76.  */
  77.  
  78. struct mf6cctl
  79. {
  80.     struct sockaddr_in6 mf6cc_origin;        /* Origin of mcast    */
  81.     struct sockaddr_in6 mf6cc_mcastgrp;        /* Group in question    */
  82.     mifi_t    mf6cc_parent;            /* Where it arrived    */
  83.     struct if_set mf6cc_ifset;        /* Where it is going */
  84. };
  85.  
  86. /*
  87.  *    Group count retrieval for pim6sd
  88.  */
  89.  
  90. struct sioc_sg_req6
  91. {
  92.     struct sockaddr_in6 src;
  93.     struct sockaddr_in6 grp;
  94.     unsigned long pktcnt;
  95.     unsigned long bytecnt;
  96.     unsigned long wrong_if;
  97. };
  98.  
  99. /*
  100.  *    To get vif packet counts
  101.  */
  102.  
  103. struct sioc_mif_req6
  104. {
  105.     mifi_t    mifi;        /* Which iface */
  106.     unsigned long icount;    /* In packets */
  107.     unsigned long ocount;    /* Out packets */
  108.     unsigned long ibytes;    /* In bytes */
  109.     unsigned long obytes;    /* Out bytes */
  110. };
  111.  
  112. /*
  113.  *    That's all usermode folks
  114.  */
  115.  
  116. #ifdef __KERNEL__
  117.  
  118. #include <linux/pim.h>
  119. #include <linux/skbuff.h>    /* for struct sk_buff_head */
  120.  
  121. #ifdef CONFIG_IPV6_MROUTE
  122. static inline int ip6_mroute_opt(int opt)
  123. {
  124.     return (opt >= MRT6_BASE) && (opt <= MRT6_BASE + 10);
  125. }
  126. #else
  127. static inline int ip6_mroute_opt(int opt)
  128. {
  129.     return 0;
  130. }
  131. #endif
  132.  
  133. struct sock;
  134.  
  135. #ifdef CONFIG_IPV6_MROUTE
  136. extern int ip6_mroute_setsockopt(struct sock *, int, char __user *, int);
  137. extern int ip6_mroute_getsockopt(struct sock *, int, char __user *, int __user *);
  138. extern int ip6_mr_input(struct sk_buff *skb);
  139. extern int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg);
  140. extern int ip6_mr_init(void);
  141. extern void ip6_mr_cleanup(void);
  142. #else
  143. static inline
  144. int ip6_mroute_setsockopt(struct sock *sock,
  145.               int optname, char __user *optval, int optlen)
  146. {
  147.     return -ENOPROTOOPT;
  148. }
  149.  
  150. static inline
  151. int ip6_mroute_getsockopt(struct sock *sock,
  152.               int optname, char __user *optval, int __user *optlen)
  153. {
  154.     return -ENOPROTOOPT;
  155. }
  156.  
  157. static inline
  158. int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg)
  159. {
  160.     return -ENOIOCTLCMD;
  161. }
  162.  
  163. static inline int ip6_mr_init(void)
  164. {
  165.     return 0;
  166. }
  167.  
  168. static inline void ip6_mr_cleanup(void)
  169. {
  170.     return;
  171. }
  172. #endif
  173.  
  174. struct mif_device
  175. {
  176.     struct net_device     *dev;            /* Device we are using */
  177.     unsigned long    bytes_in,bytes_out;
  178.     unsigned long    pkt_in,pkt_out;        /* Statistics             */
  179.     unsigned long    rate_limit;        /* Traffic shaping (NI)     */
  180.     unsigned char    threshold;        /* TTL threshold         */
  181.     unsigned short    flags;            /* Control flags         */
  182.     int        link;            /* Physical interface index    */
  183. };
  184.  
  185. #define VIFF_STATIC 0x8000
  186.  
  187. struct mfc6_cache
  188. {
  189.     struct mfc6_cache *next;        /* Next entry on cache line     */
  190.     struct in6_addr mf6c_mcastgrp;            /* Group the entry belongs to     */
  191.     struct in6_addr mf6c_origin;            /* Source of packet         */
  192.     mifi_t mf6c_parent;            /* Source interface        */
  193.     int mfc_flags;                /* Flags on line        */
  194.  
  195.     union {
  196.         struct {
  197.             unsigned long expires;
  198.             struct sk_buff_head unresolved;    /* Unresolved buffers        */
  199.         } unres;
  200.         struct {
  201.             unsigned long last_assert;
  202.             int minvif;
  203.             int maxvif;
  204.             unsigned long bytes;
  205.             unsigned long pkt;
  206.             unsigned long wrong_if;
  207.             unsigned char ttls[MAXMIFS];    /* TTL thresholds        */
  208.         } res;
  209.     } mfc_un;
  210. };
  211.  
  212. #define MFC_STATIC        1
  213. #define MFC_NOTIFY        2
  214.  
  215. #define MFC6_LINES        64
  216.  
  217. #define MFC6_HASH(a, g) (((__force u32)(a)->s6_addr32[0] ^ \
  218.               (__force u32)(a)->s6_addr32[1] ^ \
  219.               (__force u32)(a)->s6_addr32[2] ^ \
  220.               (__force u32)(a)->s6_addr32[3] ^ \
  221.               (__force u32)(g)->s6_addr32[0] ^ \
  222.               (__force u32)(g)->s6_addr32[1] ^ \
  223.               (__force u32)(g)->s6_addr32[2] ^ \
  224.               (__force u32)(g)->s6_addr32[3]) % MFC6_LINES)
  225.  
  226. #define MFC_ASSERT_THRESH (3*HZ)        /* Maximal freq. of asserts */
  227.  
  228. #endif
  229.  
  230. #ifdef __KERNEL__
  231. struct rtmsg;
  232. extern int ip6mr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait);
  233.  
  234. #ifdef CONFIG_IPV6_MROUTE
  235. extern struct sock *mroute6_socket;
  236. extern int ip6mr_sk_done(struct sock *sk);
  237. #else
  238. #define mroute6_socket NULL
  239. static inline int ip6mr_sk_done(struct sock *sk) { return 0; }
  240. #endif
  241. #endif
  242.  
  243. /*
  244.  * Structure used to communicate from kernel to multicast router.
  245.  * We'll overlay the structure onto an MLD header (not an IPv6 heder like igmpmsg{}
  246.  * used for IPv4 implementation). This is because this structure will be passed via an
  247.  * IPv6 raw socket, on wich an application will only receiver the payload i.e the data after
  248.  * the IPv6 header and all the extension headers. (See section 3 of RFC 3542)
  249.  */
  250.  
  251. struct mrt6msg {
  252. #define MRT6MSG_NOCACHE        1
  253. #define MRT6MSG_WRONGMIF    2
  254. #define MRT6MSG_WHOLEPKT    3        /* used for use level encap */
  255.     __u8        im6_mbz;        /* must be zero           */
  256.     __u8        im6_msgtype;        /* what type of message    */
  257.     __u16        im6_mif;        /* mif rec'd on           */
  258.     __u32        im6_pad;        /* padding for 64 bit arch */
  259.     struct in6_addr    im6_src, im6_dst;
  260. };
  261.  
  262. #endif
  263.